package com.eian.boot.mybatis.core.service;

import com.mybatisflex.core.FlexConsts;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.service.IService;
import org.apache.ibatis.annotations.Param;

import java.io.Serializable;
import java.util.Collection;

/**
 * @author alex.meng
 * @createTime 2024-06-02 19:08
 * @description 项目基础Service接口
 **/
public interface IBaseService<T> extends IService<T> {
    /**
     * 批量保存
     *
     * @param entities 实体集合
     * @return 保存成功的数量
     */
    boolean saveBatchRecords(Collection<T> entities);

    /**
     * 批量删除
     *
     * @param query 查询条件
     * @return 删除成功的数量
     */
    int removeBatch(QueryWrapper query);

    /**
     * 如果存在则删除
     *
     * @param query 查询条件
     * @return 删除成功的数量
     */
    boolean removeIfExists(QueryWrapper query);

    // ===== 物理删除（在逻辑删除场景下使用）=====

    /**
     * 物理删除（在启用了逻辑删除的场景下使用）
     * 根据主键删除数据。如果是多个主键的情况下，需要传入数组，例如：{@code new Integer[]{100,101}}。
     *
     * @param id 主键数据
     * @return 受影响的行数
     */
    boolean deleteByIdForce(@Param(FlexConsts.PRIMARY_VALUE) Serializable id);

    /**
     * 物理删除（在启用了逻辑删除的场景下使用）
     * 根据多个主键批量删除数据。
     *
     * @param ids 主键列表
     * @return 受影响的行数
     */
    boolean removeByIdsForce(@Param(FlexConsts.PRIMARY_VALUE) Collection<? extends Serializable> ids);

    /**
     * 物理删除（在启用了逻辑删除的场景下使用）
     * 根据多个主键批量删除数据。
     *
     * @param ids  主键列表
     * @param size 切分大小
     * @return 受影响的行数
     */
    boolean removeBatchByIdsForce(Collection<? extends Serializable> ids, int size);

    /**
     * 物理删除（在启用了逻辑删除的场景下使用）
     * 根据查询条件来删除数据。
     *
     * @param queryWrapper 条件
     * @return 受影响的行数
     */
    int removeByQueryForce(@Param(FlexConsts.QUERY) QueryWrapper queryWrapper);
}
